# -*- coding: utf-8 -*-

"""
Copyright (C) 2022, Zato Source s.r.o. https://zato.io

Licensed under AGPLv3, see LICENSE.txt for terms and conditions.
"""

# Zato
from zato.common.ext.dataclasses import dataclass, field
from zato.common.marshal_.api import Model
from zato.common.typing_ import anynone, anydictnone, anylistnone, dict_field, list_, list_field, optional

# ################################################################################################################################
# ################################################################################################################################

def get_default_address_details():
    return {'hello':'world'}

# ################################################################################################################################

def get_default_address_characteristics():
    return ['zzz', 'qqq']

# ################################################################################################################################
# ################################################################################################################################

# Note that the two classes below have the same 'name' attribute which is used by validation tests.

@dataclass(init=False, repr=False)
class LineDetails(Model):
    name: str

@dataclass(init=False, repr=False)
class LineParent(Model):
    name: str
    details: LineDetails

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=False, repr=False)
class Address(Model):
    locality: str
    post_code: optional[str]
    details: optional[dict]
    characteristics: optional[list]

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=False, repr=False)
class AddressWithDefaults(Model):
    locality: str = 'abc'
    post_code: optional[str] = '12345'
    details: optional[dict] = field(default_factory=get_default_address_details) # type: ignore
    characteristics: optional[list] = field(default_factory=get_default_address_characteristics) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=False, repr=False)
class User(Model):
    user_name: str
    address: Address

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=False, repr=False)
class Role(Model):
    type: str
    name: str

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class CreateUserRequest(Model):
    request_id: int
    user: User
    role_list: list_[Role] = field(default_factory=list) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class Attr(Model):
    type: str
    name: str

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class Phone(Model):
    attr_list: list_[Attr] = field(default_factory=list) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class Modem(Model):
    attr_list: list_[Attr] = field(default_factory=list) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class CreatePhoneListRequest(Model):
    phone_list: list_[Phone] = field(default_factory=list) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=True, repr=False)
class CreateAttrListRequest(Model):
    attr_list: list_[Attr] = field(default_factory=list) # type: ignore

# ################################################################################################################################
# ################################################################################################################################

@dataclass(init=False, repr=False)
class WithAny(Model):
    str1: anynone
    list1: anylistnone = list_field()
    dict1: anydictnone = dict_field()

# ################################################################################################################################
# ################################################################################################################################

class TestService:
    pass

# ################################################################################################################################
# ################################################################################################################################
